package san.java.day14;

import java.lang.reflect.Constructor;

/**
 * 通过反射调用类的完整结构:
 *  1. 类的全部接口
 *  2. 所继承的父类
 *  3. 全部的构造器
 *  4. 全部的方法
 *  5. 全部的Fields
 */

public class Reflect_03 {

    public static void testReflect() throws ClassNotFoundException {

        Class<?> dogClass = Class.forName("san.java.day14.GoldenDog");


        // 1. 获取类的全部接口
        Class<?>[] interfaces = dogClass.getInterfaces();

        for (@SuppressWarnings("rawTypes") Class t: interfaces) {
            System.out.println(t.getName());
        }

        // 2. 所继承的父类
        Class<?> superclass = dogClass.getSuperclass();
        System.out.println(superclass.getName());

        // 3. 获取全部的构造器
        // 获取类的共有构造方法
        Constructor<?>[] constructors = dogClass.getConstructors();  //

        for (Constructor c: constructors) {
            System.out.println("===============================");
            System.out.println("构造方法修饰符: " + c.getName() + "的修饰符是: " + c.getModifiers());
            Class[] parameterTypes = c.getParameterTypes();
            for (Class param: parameterTypes) {
                System.out.println(param.getName());
            }

            System.out.println("================================");
        }

        // 获取类的所有构造方法, 包括公有和私有
        Constructor<?>[] declaredConstructors = dogClass.getDeclaredConstructors();
        for (Constructor c: declaredConstructors) {
            System.out.println(c.getName());
        }
        // 4.
    }

    public static void main(String[] args) {

        GoldenDog big_yellow = new GoldenDog("Big Yellow", 1);
        System.out.println(big_yellow.getName());

        try {
            testReflect();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }

    }
}
